package com.nongtai.controller;

import com.nongtai.constant.ExceptionConstant;
import com.nongtai.exception.InvalidCategoryIdException;
import com.nongtai.exception.MissingInformationException;
import com.nongtai.pojo.dto.SubCategoryGoodsPageDto;
import com.nongtai.pojo.entity.Goods;
import com.nongtai.pojo.vo.GoodsCategoryVo;
import com.nongtai.pojo.vo.GoodsVo;
import com.nongtai.pojo.vo.SubCategoryVo;
import com.nongtai.result.PageResult;
import com.nongtai.result.Result;
import com.nongtai.service.GoodsCategoryService;
import com.nongtai.service.GoodsService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

/**
 * 首页数据展示相关
 * @author yza
 * @version 1.0
 * @date 2024/6/1 18:44
 */

@RestController
@Slf4j
public class GoodsCategoryController {
    @Resource
    private GoodsCategoryService goodsCategoryService;
    @Resource
    private GoodsService goodsService;

    /**
     * 获取首页展示分类数据
     * @return
     */
    @GetMapping("/home/category/head")
    public Result<List<GoodsCategoryVo>> getCategoryInHead(){
        List<GoodsCategoryVo> goodsCategoryVoList = goodsCategoryService.getGoodsCategoryList();
        // TODO 目前是获取所有商品，后边应该是获取每个分类下的热门推荐商品
        List<Goods> allGoods = goodsService.getAllGoods();

        HashMap<Long, GoodsCategoryVo> map = new HashMap<>();
        for (GoodsCategoryVo goodsCategoryVo : goodsCategoryVoList){
            map.put(goodsCategoryVo.getId(),goodsCategoryVo);
        }

        for (Goods goods : allGoods){
            Long categoryId = goods.getCategoryId();
            GoodsVo goodsVo = new GoodsVo();
            BeanUtils.copyProperties(goods,goodsVo);
            GoodsCategoryVo goodsCategoryVo = map.get(categoryId);
            goodsCategoryVo.getGoods().add(goodsVo);
        }

        return Result.success(goodsCategoryVoList);
    }

    /**
     * 根据商品分类ID获取分类信息及其下的商品列表。
     * 此接口提供了查询特定商品分类详细信息的能力，包括该分类下的所有子分类和对应的商品。
     *
     * @param id 商品分类的ID，用于查询特定的分类信息。
     * @return 返回包含商品分类信息和对应商品列表的结果对象。
     */
    @GetMapping("/category")
    public Result<GoodsCategoryVo> getCategoryById(@RequestParam("id") Long id){
        if (id == null){
            throw new MissingInformationException("分类id不能为空");
        }
        if (id <= 0){
            throw new InvalidCategoryIdException(ExceptionConstant.INVALID_CATEGORY_ID + id);
        }
        // 通过商品分类ID查询分类信息。
        GoodsCategoryVo categoryById = goodsCategoryService.getCategoryById(id);

        // 获取所有商品信息，用于后续匹配分类下的商品。
        List<Goods> allGoods = goodsService.getAllGoods();

        // 遍历当前分类下的所有子分类。
        List<GoodsCategoryVo> children = categoryById.getChildren();
        for(GoodsCategoryVo goodsCategoryVo : children){
            // 获取当前子分类的ID。
            Long categoryVoId = goodsCategoryVo.getId();
            // 获取当前子分类对应的商品列表。
            List<GoodsVo> goodsVoList = goodsCategoryVo.getGoods();

            // 遍历所有商品，找出属于当前子分类的商品，并添加到对应的商品列表中。
            for(Goods goods : allGoods){
                // 判断商品是否属于当前子分类。
                if(goods.getCategoryIdDetails() != null && goods.getCategoryIdDetails().equals(categoryVoId)){
                    // 创建一个新的商品VO对象，用于存储从Goods对象复制过来的数据。
                    GoodsVo goodsVo = new GoodsVo();
                    // 将Goods对象的数据复制到GoodsVo对象中。
                    BeanUtils.copyProperties(goods,goodsVo);
                    // 将复制完数据的商品VO对象添加到当前子分类的商品列表中。
                    goodsVoList.add(goodsVo);
                }
            }
        }
        // 返回包含分类信息和对应商品列表的结果对象。
        return Result.success(categoryById);
    }

    /**
     * 根据二级分类id获取该分类信息，父分类信息，该分类包含商品信息
     * @param id 二级分类id
     * @return
     */
    @GetMapping("/category/sub/filter")
    public Result<SubCategoryVo> getSubCategoryById(@RequestParam("id") Long id){
        SubCategoryVo subCategoryVo = goodsCategoryService.getSubCategoryById(id);
        return Result.success(subCategoryVo);
    }

    /**
     * 根据二级分类id分页查询该分类下的所有商品信息
     */
    @PostMapping("/category/goods/temporary")
    public Result<PageResult> getGoodsByCategoryId(@RequestBody()SubCategoryGoodsPageDto goodsPageDto){
        List<GoodsVo> goodsList = goodsService.getGoodsBySubCategoryId(goodsPageDto);

        PageResult pageResult = new PageResult();
        pageResult.setPage(goodsPageDto.getPage()); //第几页
        pageResult.setPageSize(goodsPageDto.getPageSize()); // 每页数量
        pageResult.setCounts(goodsList.size()); // 一共多少条数据
        pageResult.setItems(goodsList); // 商品列表
        pageResult.setPages((goodsList.size() - 1) / goodsPageDto.getPageSize() + 1); // 总共多少页

        return Result.success(pageResult);

    }

}
